<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>基本包装类型</title>
    <script>
        /**
         * s1包含一个字符串， 字符串为基本类型数据，执行第二行代码将返回的结果保存在s2中 ，但是基本类型并没有方法，所以这是后台作了某些处理：
         * 在第二行代码执行时，访问s1的过程是一种读取的过程，也就是从内存中读取字符串的过程，在这个读取的过程后台作了以下处理：
         * 1. 创建一个String类型的示例
         * 2. 在实例上调用指定的方法(此处调用substring)
         * 3. 销毁这个实例
         *
         * @type {string}
         */
        let s1 = "some text";
        let s2 = s1.substring(2);
         console.log(s2);//ome text

        //上面第二行代码的三个步骤 可以想象成执行了如下代码
        // let s1 = new String("some text");
        // let s2 = s1.substring(2);
        // s1 = null;

        /**
         * 使用new 创建的基本包装类型数据和后台为我们自动创建的基本包装类型的区别是： 前者在执行流离开当前作用域之前一直在内存中，
         * 后者则只存在于一行代码执行瞬间，然后立即被销毁
         * 例如下面这个例子，
         */
        let s3 = "some";
        s3.color = "blue";//该行创建的String对象，在第三行已经被销毁了，第三行代码又创建了自己的String对象，而该对象没有color属性
         console.log(s3.color);//undefined

        //将字符串传递给Object构造函数，就会得到String实例，同样，传递其它基本类型数据，也会得到对应的基本包装类型对象。
        let obj = new Object("some");
        console.log(obj instanceof String);//true

        let obj2 = new Object(2);
        console.log(obj2 instanceof Number);//true

        let obj3 = new Object(true);
        console.log(obj3 instanceof Boolean);//true

        let value = 20;
        let number = Number(value);//保存的是基本类型的值
        console.log(typeof number);//number
        console.log(number instanceof Number); //false
        let obj4 = new Number(value); //保存的是number实例
        console.log(typeof obj4);//object
        console.log(obj4 instanceof Number); //true





    </script>
</head>
<body>
基本包装类型
</body>
</html>